package types

// TaskType 任务类型
type TaskType string

func (t TaskType) String() string {
	return string(t)
}

const (
	TaskImage     = TaskType("image")     // 文生图
	TaskBlend     = TaskType("blend")     // 融图
	TaskSwapFace  = TaskType("swapFace")  // 换脸
	TaskUpscale   = TaskType("upscale")   // 放大指定的图片
	TaskVariation = TaskType("variation") // 图生图
)

type MjTask struct {
	Id               uint     `json:"id"`                   // 数据库中存储任务的Id
	TaskId           string   `json:"task_id"`              // 中转任务ID
	ClientId         string   `json:"client_id"`            // 客户端Id
	ImgArr           []string `json:"img_arr"`              // 图片地址数组
	Type             TaskType `json:"type"`                 // 任务类型
	UserId           int      `json:"user_id"`              // 用户Id
	Prompt           string   `json:"prompt,omitempty"`     // 提示词
	NegPrompt        string   `json:"neg_prompt,omitempty"` // 负面提示词
	Params           string   `json:"full_prompt"`          // 提示词参数
	Index            int      `json:"index,omitempty"`
	MessageId        string   `json:"message_id,omitempty"`
	MessageHash      string   `json:"message_hash,omitempty"`
	ChannelId        string   `json:"channel_id"`         // 渠道ID，用来区分是哪个渠道创建的任务，一个任务的 create 和 action 操作必须要在同一个渠道
	Mode             string   `json:"mode"`               // 绘画模式，relax，fast，turbo
	TranslateModelId int      `json:"translate_model_id"` // 提示词翻译模型ID
}

type SdTask struct {
	Id               int          `json:"id"`                 // JOB 数据库ID
	Type             TaskType     `json:"type"`               // 任务类型
	ClientId         string       `json:"client_id"`          // 客户端Id
	UserId           int          `json:"user_id"`            // 用户Id
	Params           SdTaskParams `json:"params"`             // sd 请求参数
	RetryCount       int          `json:"retry_count"`        // 重试次数
	TranslateModelId int          `json:"translate_model_id"` // 提示词翻译模型ID
}

type SdTaskParams struct {
	ClientId     string  `json:"client_id"`      // 客户端ID
	TaskId       string  `json:"task_id"`        // 任务Id
	Prompt       string  `json:"prompt"`         // 提示词
	NegPrompt    string  `json:"neg_prompt"`     // 反向提示词
	Steps        int     `json:"steps"`          // 迭代步数，默认20
	Sampler      string  `json:"sampler"`        // 采样器
	Scheduler    string  `json:"scheduler"`      // 采样调度
	FaceFix      bool    `json:"face_fix"`       // 面部修复
	CfgScale     float32 `json:"cfg_scale"`      // 引导系数，默认7
	Seed         int64   `json:"seed"`           // 随机数种子
	Height       int     `json:"height"`         // 高度
	Width        int     `json:"width"`          // 宽度
	HdFix        bool    `json:"hd_fix"`         // 启用高清修护
	HdRedrawRate float32 `json:"hd_redraw_rate"` // 高清修复重绘幅度
	HdScale      int     `json:"hd_scale"`       // 放大倍数
	HdScaleAlg   string  `json:"hd_scale_alg"`   // 放大算法
	HdSteps      int     `json:"hd_steps"`       // 高清修复迭代步数
}

// DallTask DALL-E task
type DallTask struct {
	ClientId         string `json:"client_id"`          // 客户端Id
	ModelId          uint   `json:"model_id"`           // 模型Id
	ModelName        string `json:"model_name"`         // 模型名称
	Id               uint   `json:"id"`                 // DallJob Id
	UserId           uint   `json:"user_id"`            // 用户Id
	Prompt           string `json:"prompt"`             // 提示词
	N                int    `json:"n"`                  // 生成图片数量
	Quality          string `json:"quality"`            // 图片质量
	Size             string `json:"size"`               // 图片大小
	Style            string `json:"style"`              // 图片风格
	Power            int    `json:"power"`              // 消耗算力
	TranslateModelId int    `json:"translate_model_id"` // 提示词翻译模型ID
}

type SunoTask struct {
	ClientId     string `json:"client_id"`
	Id           uint   `json:"id"`
	Channel      string `json:"channel"`
	UserId       int    `json:"user_id"`
	Type         int    `json:"type"`                  // 音乐模式 1为灵感模式
	Title        string `json:"title"`                 // 音乐标题
	RefTaskId    string `json:"ref_task_id,omitempty"` // 续写的前任务id
	RefSongId    string `json:"ref_song_id,omitempty"` // 需要继续创作时使用。含义为，需要继续创作的歌曲 id
	Prompt       string `json:"prompt"`                // 提示词、歌词
	Tags         string `json:"tags"`                  // 音乐风格, 使用半角逗号隔开
	Model        string `json:"model"`                 // 模型
	Instrumental bool   `json:"instrumental"`          // 是否纯音乐
	ExtendSecs   int    `json:"extend_secs,omitempty"` // 需要继续创作时使用。含义为，从第几秒开始继续创作，例如 120.00 或者 61.59
	SongId       string `json:"song_id,omitempty"`     // 合并歌曲ID
	AudioURL     string `json:"audio_url"`             // 用户上传音频地址
}

const (
	VideoLuma   = "luma"
	VideoRunway = "runway"
	VideoCog    = "cog"
)

type VideoTask struct {
	ClientId         string      `json:"client_id"`
	Id               uint        `json:"id"` // 数据库JOB Id
	Channel          string      `json:"channel"`
	UserId           int         `json:"user_id"`
	Type             string      `json:"type"`
	TaskId           string      `json:"task_id"`
	Prompt           string      `json:"prompt"` // 提示词
	Params           VideoParams `json:"params"`
	TranslateModelId int         `json:"translate_model_id"` // 提示词翻译模型ID
}

type VideoParams struct {
	PromptOptimize bool   `json:"prompt_optimize"` // 是否优化提示词
	Loop           bool   `json:"loop"`            // 是否循环参考图
	StartImgURL    string `json:"start_img_url"`   // 第一帧参考图地址
	EndImgURL      string `json:"end_img_url"`     // 最后一帧参考图地址
	Model          string `json:"model"`           // 使用那个模型生成视频
	Radio          string `json:"radio"`           // 视频尺寸
	Style          string `json:"style"`           // 风格
	Duration       int    `json:"duration"`        // 视频时长（秒）
}
